//
//  JStatus.swift
//  JMicroBlog
//
//  Created by Jason on 21/5/15.
//  Copyright (c) 2015 Shepherd. All rights reserved.
//

import UIKit
import SDWebImage
// 获取微博信息的请求URL
//private let WB_HOME_LINE_URL = "https://api.weibo.com/2/statuses/friends_timeline.json"
private let WB_HOME_LINE_URL = "https://api.weibo.com/2/statuses/friends_timeline.json"

// MARK: - 微博模型对象
class JStatus: NSObject {
   
    // MARK: - 成员属性
    
    // 微博发布时间
    var created_at : String?
    // 微博id
    var id : Int = 0
    
    // 微博正文
    var text : String?
    
    // 微博来源
    var source : String?
    
    // 配图字典
    var pic_urls : [[String:String]]? {
        didSet {
            
            imgURLs = [NSURL]()
            largeURLs = [NSURL]() // 大图数组的初始化
            for pic_url in pic_urls! {
                if let urlString = pic_url["thumbnail_pic"] {
                    // 计算大图地址
                    let largeString = (urlString as NSString).stringByReplacingOccurrencesOfString("thumbnail",
                        withString: "large")
                    imgURLs?.append(NSURL(string: urlString)!)
                    largeURLs?.append(NSURL(string: largeString)!)
                }
            }
            JLog.i(largeURLs,false)
        }
    }
    
    // 配图用的url数组
    private var imgURLs : [NSURL]?
    
    // 大图的url数组
    private var largeURLs : [NSURL]?
    
    // 如果是转发微博,那么原微博没有配图数组
    // 如果是原创微博,返回原创微博的图片 url
    var pictureURL : [NSURL]? {
        if retweeted_status == nil {
            return imgURLs
        } else {
            return retweeted_status?.imgURLs
        }
    }
    
    var largePicURLs : [NSURL]? {
        return retweeted_status != nil ? retweeted_status?.largeURLs : largeURLs
    }
    // 属性数组
    private static let properties = ["created_at","id","text","source","pic_urls"]
    
    // 额外添加的属性数组
    var user:JUser?
    
    // 转发微博
    var retweeted_status: JStatus?
    
    // MARK: - 关键方法
    init(dict:[String:AnyObject]) {
        super.init()
        for key in JStatus.properties {
            if dict[key] != nil {
                // 在swift中使用KVC中,需要先用super.init()实例化对象
                setValue(dict[key], forKey: key)
            }
            // 针对JUser单独进行处理
            if dict["user"] != nil {
                user = JUser(dict: dict["user"] as! [String:AnyObject])
            }
            
            // 单独处理转发微博
            if dict["retweeted_status"] != nil {
                retweeted_status = JStatus(dict: dict["retweeted_status"] as! [String:AnyObject])
            }
        }
    }
    
    // MARK: - 数据处理
    
    /** 发送请求,获取微博数据 
        since_id:获取id比since_id大的微博数据 做下拉刷新用的
        max_id :获取id比max_id大的微博数据 做上拉刷新用的
      */
    class func loadStatuses(#since_id:Int,max_id:Int,completion:(statuses:[JStatus]?)->()) {
        var params = ["access_token":sharedUserInfo!.access_token]
        if since_id > 0 {
            params["since_id"] = "\(since_id)"
        }else if max_id > 0 {
            // 居然是字符串错了 然后就花了这么久 其实调试要清晰
            params["max_id"] = "\(max_id-1)"
        }
        JNetworkTools.responseJSON(.GET, URLString: WB_HOME_LINE_URL, params: params) { JSON in
            if JSON != nil {                
                // 取得微博信息中的statue字典
                if let arrs = (JSON as! NSDictionary)["statuses"] as? [[String:AnyObject]] {
                    
                    let result = JStatus.statusWithArray(arrs)
                    self.cacheStatusImages(result,completion:completion)
                    return
                }
            }
            completion(statuses: nil)
        }
    }
    
    /**
    字典数组转模型数组
    
    :param: arrs 字典数组
    
    :returns: 模型数组
    */
    private class func statusWithArray(arrs : [[String:AnyObject]]?) -> [JStatus]? {
        // 得到的数据为nil,直接返回
        if arrs == nil {
            return nil
        }
        
        // 定义并实例化一个可变数组
        var arrM = [JStatus]()
        for arr in arrs! {
            let status = JStatus(dict: arr)
            arrM.append(status)
        }
        return arrM
    }
    
    /**
    缓存所有图片的方法
    
    :param: status 微博数据数组
    */
    private class func cacheStatusImages(statuses:[JStatus]?,completion:(statuses:[JStatus]?)->()) {
        if statuses == nil {
            completion(statuses: nil)
            return
        }
        
        // 因为需要图片缓存加载完成 才进行UI上的加载 但是现在时异步的,所以需要建立一个进程组进行监听
        let group = dispatch_group_create()
        
        // 遍历微博数据数组
        for s in statuses as [JStatus]! {
            JLog.i(s.pictureURL,false)
            
            // 没有图片
            if s.pictureURL == nil {
                continue
            }
            
           
            // 有图片就用sdwebimage加载图片
            for imgURL in s.pictureURL! {
                // 1. 进入群组
                dispatch_group_enter(group)
                // downloadImageWithURL本身会进行下载并缓存
                SDWebImageManager.sharedManager().downloadImageWithURL(imgURL, options: nil, progress: nil, completed: { (_, _, _, _, _) in
                    // 2.离开群组
                    dispatch_group_leave(group)
                })
            }
        }
        dispatch_group_notify(group, dispatch_get_main_queue(), {
            JLog.i("图片缓存完成:\(NSHomeDirectory())",false)
            completion(statuses: statuses)
        })
    }
}
